public function update(Request $request){
$validated = $request->validate([
'name' => ['require', 'string', 'max:255']
]);
}
public function update(Request $request){
$validated = $request->validateWithBag('product', [
'name' => ['require', 'string', 'max:255']
]);
}
// View 中可以區隔取出錯誤訊息
// {{ $errors->product->first('name') }}
驗證後若有不符合驗證規則的資料, 會拋出錯誤訊息, 預設會回傳到表單頁面
<!-- 判斷是否有驗證錯誤訊息 -->
@if ( $errors->any() )
@foreach ( $errors->all() as $error )
<!-- 單筆錯誤訊息 -->
<p>{{ $error }}</p>
@endforeach
@endif
// 若有單一欄位名稱多筆錯誤訊息, 預取出第一個錯誤訊息
echo $errors->first('spec_name');
// 單一欄位名稱多筆錯誤訊息, 取出所有錯誤訊息
foreach ( $errors->get('spec_name') as $spec ) {
echo "<li>".$spec."</li>";
}
// 陣列欄位顯示錯誤訊息, 使用 * 遍歷規格名稱
foreach ($errors->get('spec_name.*') as $spec) {
// ... 要顯示的內容
}
自訂錯誤訊息內容
當請求的 header 內指定要回傳 json 格式, 會產稱 JSON response 並設定狀態碼為 422
php artisan make:request ProductPostRequest
public function rules()
{
// 判斷是否有 id 值
$id = $this->route('id');
$unique_name = Rule::unique('pj_category');
// 驗證名稱不能重複, 排除本身
if ($id != '') $unique_name->ignore($id);
return [
'name' => [
'required',
$unique_name,
'max:255'
],
'parent_id' => 'nullable|integer',
'order' => 'nullable|integer',
'display' => 'nullable|integer',
];
}
public function authorize()
{
return true;
}
public function withValidator($validator)
{
$validator->after(function($validator){
if( $price < $market_price ) {
$validator->errors()->add('price', '建議售價需大於售價');
}
});
}
其他設定
protected $stopOnFirstFailure = true;
// 使用路徑設定
protected $redirect = '/errorMessage';
// 使用路由名稱設定
protected $redirectRoute = 'errorMessage';
Contorller 內取得驗證後的值
// 取得所有通過驗證的值
$validated = $request->validated();
// 取回部分通過驗證的值
$validated = $request->safe()->only(['name', 'email']);
$validated = $request->safe()->except(['name', 'email']);
public function messages()
{
return [
'productImg.*.mimes' => '僅能上傳格視為 jpg,jpeg,png 圖片',
'productImg.*.max' => '圖片最大尺寸為 2MB',
'category_name_parent.string' => '全站類別名稱須為文字',
'category_parent.integer' => '全站類別id必須為數字',
'category_name_childen.string' => '全站子類別名稱須為文字',
'category_childen.integer' => '全站子類別id必須為數字',
'spec_parent_name.*.string' => '規格分類名稱須為文字',
'spec_parent.*.integer' => '規格分類id須為數字',
'spec_name_childen.*.string' => '規格子分類名稱須為文字',
'spec_childen.*.integer' => '規格子分類id須為數字',
'spec_reserve.*.integer' => '庫存必須為數字',
'spec_reserve.*.min' => '庫存數須大於等於 :min',
'spec_low_reserve.*.integer' => '最小警告值須為數字',
'spec_low_reserve.*.min' => '最小警告值須大於等於 :min',
'spec_volume.*.string' => '材積須為數字',
'spec_volume.*.max' => '材積值長度最大為 :max',
'spec_weight.*.string' => '重量須為文字',
'spec_weight.*.max' => '重量最大長度須為 :max',
'spec_order.*.integer' => '排序值須為數字',
];
}
public function attributes()
{
return [
'name' => '類別名稱',
'parent_id' => '父階層',
'order' => '排序',
'display' => '是否顯示於前台選單'
];
}
protected function prepareForValidation()
{
$this->merge([
'name' => trim($this->name),
]);
}
$rules = [
'name' => [
'required',
Rule::unique('pj_data_type')->ignore($id),
'max:255'
],
'icon' => 'nullable|string',
'disabled' => 'nullable|boolean',
'router_path' => 'nullable|string',
];
$validator = Validator::make($input, $rules);
if($validator->fails()){
// 若失敗要執行的動作, e.g. 返回上一頁並傳遞錯誤訊息與使用者輸入欄位值
return back()->withErrors($validator)->withInput($input);
}
$validator->after(function ($validator) {
// ... 另外要驗證內容
}
});